import numpy as np
import pandas as pd

# >>> 1、 创建数据对象
# 1.1 用Series创建一个一维数据对象
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)

# 1.2 用DataFrame创建一个二维数据对象
dates = pd.date_range('20130101', periods=6)
print(dates)
df = pd.DataFrame(np.random.random((6, 4)), index=dates, columns=list('ABCD'))
print(df)

# 1.3 用Dict创建一个二维数据对象
df2 = pd.DataFrame(
    {
        'A': 1.0,
        'B': pd.Timestamp('20130102'),
        'C': pd.Series(1, index=list(range(4)), dtype='float32'),
        'D': np.array([3] * 4, dtype='int32'),
        'E': pd.Categorical(["test", "train", "test", "train"]),
        'F': 'foo'
    }
)
print(df2)
print(df2.dtypes)

# >>> 2、查看数据
# 2.1 显示头尾部分数据
head = df.head()
print(head)
tail = df.tail()
print(tail)

# 2.2 显示行列索引结构
index = df.index
print(index)
columns = df.columns
print(columns)

# 2.3 转换为numpy数组
toNumpy = df.to_numpy()
print(toNumpy)

# 2.4 显示统计数据
describe = df.describe()
print(describe)

# 2.5 排序-按列名排序
sort = df.sort_index(axis=1, ascending=False)
print(sort)

# 2.6 排序-按列值排序
sort = df.sort_values(by='B')
print(sort)

# >>> 3、数据查询
# 3.1 通过列名查询
dfA = df['A']
print(dfA)

# 3.2 切片查询
df3 = df[0:3]
print(df3)

# 3.3 通过行索引查询
df3 = df.loc[dates[0]]
print(df3)

# 3.4 通过行列号查询
df3 = df.iloc[3] #第四行
print(df3)
df3 = df.iloc[3:5, 0:2] #第4 5行，第1 2列
print(df3)
df3 = df.iat[1, 1] #精确查询值
print(df3)

# >>> 4、条件过滤
# 4.1 单列数据过滤
df4 = df[df["A"] > 0.3]
print(df4)
# 4.2 所有数据过滤
df4 = df[df > 0.3]
print(df4)
# 4.3 in过滤
df2 = df.copy()
df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']
df3 = df2[df2['E'].isin(['two', 'four'])]
print(df3)

# >>> 5、数据值重设
# 5.1 添加一列数据
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range("20130101", periods=6))
print(s1)
df["F"] = s1
print(df)

# 5.2 通过列名修改数据
df.at[dates[0], 'A'] = 0
print(df)

# 5.3 通过行列位置修改数据
df.iat[0,1] = 0
print(df)

# 5.4 用numpy数组修改一列数据
df.loc[:, "D"] = np.array([5] * len(df))
print(df)

# >>> 6 处理NaN数据
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ["E"])
print(df1)
df1.loc[dates[0]:dates[1], "E"] = 1
print(df1)

# 6.1 删除NaN数据
df2 = df1.dropna(how='any')
print(df2)

# 6.2 替换NaN数据
df2 = df1.fillna(value=5)
print(df2)

# 6.3 根据NaN值获取布尔矩阵
booleanmask = pd.isna(df1)
print(booleanmask)




